import globals from "globals";
import pluginJs from "@eslint/js";
import tseslint from "typescript-eslint";
import pluginVue from "eslint-plugin-vue";
import pluginImport from "eslint-plugin-import";
import pluginPrettier from "eslint-plugin-prettier";

/** @type {import('eslint').Linter.Config[]} */
export default [
  // 基础配置
  {
    ignores: [
      "*.sh",
      "node_modules",
      "*.md",
      "*.woff",
      "*.ttf",
      ".vscode",
      ".idea",
      "dist",
      "/public",
      "/docs",
      ".husky",
      ".local",
      "/bin",
      "/src/mock/*",
      "stats.html"
    ]
  },
  { files: ["**/*.{js,mjs,cjs,ts,vue}"] },
  { languageOptions: { globals: globals.browser } },
  pluginJs.configs.recommended,
  ...tseslint.configs.recommended,
  ...pluginVue.configs["flat/essential"],
  ...pluginImport.configs.recommended,
  ...pluginPrettier.configs.recommended,
  { files: ["**/*.vue"], languageOptions: { parserOptions: { parser: tseslint.parser, extraFileExtensions: [".vue"] } } },
  {
    /**
     * "off" 或 0    ==>  关闭规则
     * "warn" 或 1   ==>  打开的规则作为警告（不影响代码执行）
     * "error" 或 2  ==>  规则作为一个错误（代码不能执行，界面报错）
     */
    rules: {
      // 基础ESLint规则 (http://eslint.cn/docs/rules)
      "no-var": "error", // 要求使用 let 或 const 而不是 var
      "no-multiple-empty-lines": ["error", { max: 1 }], // 不允许多个空行
      "prefer-const": "off", // 使用 let 关键字声明但在初始分配后从未重新分配的变量，要求使用 const
      "no-use-before-define": "off", // 禁止在函数/类/变量定义之前使用它们

      // TypeScript规则 (https://typescript-eslint.io/rules)
      "@typescript-eslint/no-unused-vars": "error", // 禁止定义未使用的变量
      "@typescript-eslint/no-empty-function": "error", // 禁止空函数
      "@typescript-eslint/prefer-ts-expect-error": "error", // 强制使用 @ts-expect-error 代替 @ts-ignore
      "@typescript-eslint/ban-ts-comment": "error", // 禁止 @ts-<directive> 使用注释或要求在指令后进行描述
      "@typescript-eslint/no-inferrable-types": "off", // 可推断的显式类型会增加冗长
      "@typescript-eslint/no-namespace": "off", // 禁止使用自定义TypeScript模块和命名空间
      "@typescript-eslint/no-explicit-any": "off", // 禁止使用any类型
      "@typescript-eslint/ban-types": "off", // 禁止使用特定类型
      "@typescript-eslint/no-var-requires": "off", // 允许使用require()导入模块
      "@typescript-eslint/no-non-null-assertion": "off", // 禁止非空断言(!)

      // Vue规则 (https://eslint.vuejs.org/rules)
      "vue/script-setup-uses-vars": "error", // 防止<script setup>变量在<template>中被标记未使用
      "vue/v-slot-style": "error", // 强制v-slot指令格式
      "vue/no-mutating-props": "error", // 禁止修改组件props
      "vue/custom-event-name-casing": "error", // 自定义事件名称强制小写
      "vue/html-closing-bracket-newline": "error", // 标签右括号换行要求
      "vue/attribute-hyphenation": "error", // 属性名强制连字符格式（my-prop）
      "vue/attributes-order": "off", // 属性顺序强制要求
      "vue/no-v-html": "off", // 禁止使用v-html
      "vue/require-default-prop": "off", // 要求必填prop提供默认值
      "vue/multi-word-component-names": "off", // 组件名强制多单词格式
      "vue/no-setup-props-destructure": "off" // 禁止解构setup的props
    }
  }
];
